import 'package:flutter/material.dart';

// 定义有状态组件
// 快捷键：fstfull，得安装插件：Flutter Widget Snippets
class HomePage02 extends StatefulWidget {
  const HomePage02({Key? key}) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage02> {
  // 状态变量
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('生命周期'), backgroundColor: Colors.pink),
      body: MyInfo(count: count),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 更改状态使用setState
          setState(() {
            count++;
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

// 在这个组件里观察生命周期
class MyInfo extends StatefulWidget {
  MyInfo({super.key, required this.count});

  // 接收父组件count
  int count;

  // 第一个生命周期钩子函数，进入组件调用的第一个钩子函数
  @override
  _MyInfoState createState() {
    print('生命周期函数：createState');
    return _MyInfoState();
  }
}

class _MyInfoState extends State<MyInfo> {
  int age = 0;
  String lifeCycleLog = '';

  // 第二个生命周期钩子函数，获取数据，发请求
  @override
  void initState() {
    // TODO: implement initState
    print('生命周期函数：initState');
    super.initState();
    setState(() {
      lifeCycleLog += '\n调用生命周期函数：initState()';
    });
  }

  // 第三个生命周期钩子函数，状态组件的依赖项发生变化时调用，只会被执行1次
  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    print('生命周期函数：didChangeDependencies');
    super.didChangeDependencies();
    lifeCycleLog += '\n调用生命周期函数：didChangeDependencies()';
  }

  // 组件即将销毁时自动调用，dispose前调用
  @override
  void deactivate() {
    // TODO: implement deactivate
    print('生命周期函数：deactivate');
    super.deactivate();
    lifeCycleLog += '\n调用生命周期函数：deactivate()';
  }

  // 组件销毁后调用，组件返回或者条件渲染不成立时组件销毁
  @override
  void dispose() {
    print('生命周期函数：dispose');
    super.dispose();
    lifeCycleLog += '\n调用生命周期函数：dispose()';
  }

  // 父组件状态有更新时调用，build前调用
  @override
  void didUpdateWidget(covariant MyInfo oldWidget) {
    print('生命周期函数：didUpdateWidget');
    super.didUpdateWidget(oldWidget);
    lifeCycleLog += '\n调用生命周期函数：didUpdateWidget()';
  }

  // 渲染组件，每次进入组件或者状态有更新就调用
  @override
  Widget build(BuildContext context) {
    print('生命周期函数：build');
    lifeCycleLog += '\n调用生命周期函数：build()';
    return Center(
      child: Column(
        // 主轴方向居中
        // mainAxisAlignment: MainAxisAlignment.center,
        children: [
          TextButton(
            onPressed: () {
              setState(() {
                age++;
              });
            },
            child: Text('计数器：${widget.count}，点我增加岁数，今年$age岁'),
          ),
          Text(lifeCycleLog),
        ],
      ),
    );
  }
}
